、ん Scott Meyers による本書推薦の言葉 」 ohn VIissides による本書推薦の言葉 まえがき 謝辞 訳者まえがき 第一部 テクニック 第 1 章 ポリシーを基にしたクラス・デザイン ソフトウェア・デザインの多様性 1.2 何でもやっちゃえインタフェースの失敗 . 1.3 多重継承で解決できるのか ? 1.4 テンプレートが希望の光を投げかける . 1.5 ポリシーとポリシー・クラス 1.6 ポリシーの拡張 . 1.7 ポリシー・クラスのデストラクタ 1.8 追加機能と不完全な実体化 . 1.9 ポリシー・クラスの結合 ポリシー・クラスにおける構造のカスタマイズ 1.10 互換性のあるポリシーと互換性の無いポリシー 1.11 クラスのポリシーへの分解 1.12 総括 . 1.13 第 2 章 テクニック コンパイル時の表明 2.1 2.2 テンプレートの部分的な特殊化 2.3 ローカル・クラス IX XIII XV XXI XXIII 1 っつ -4 、 6 8 っつひ 4 - りー 8 0 っ 1 一 1 1 1 1 -1 っっ 4 5 り 8 0 っ 4 っ編っっ 0
整数定数の型へのマッピング 2.4 型から型へのマッピング . 2.5 2.6 型の選択 コンパイル時における変換可能性と継承の検出 2.7 type-info のラッノヾ 2.8 Nu11Type と EmptyType 2.9 型の特性 2.10 総括 . 2.11 タイプリスト 第 3 章 タイプリストの必要性 タイプリストの定義 3.2 タイプリスト生成の単純化 . 3.3 3.4 長さの算出 3.5 休憩 . インデックスによるアクセス 3.6 タイプリストの検索 タイプリストへの連結 3.8 タイプリストからの型の削除 3.9 重複の削除 . 3.10 タイプリスト中にある要素の置換 3.11 タイプリストの部分的な並べ替え 3.12 タイプリストを用いたクラスの生成 3.13 総括 . 3.14 タイプリストのまとめ 3.15 小規模オブジェクトの割り当て 第 4 章 4.1 デフォルトの自由領域アロケータ メモリ・アロケータの作業 . 4.2 小規模オプジェクト・アロケータ 4.3 4.4 Chunk 4.5 FixedA110cator Sma110bjA110cator クラス . 4.6 コンパイラによる手品 4.7 4.8 簡潔に , 複雑に , そして最後は簡潔に 管理上の些細な点 4.9 総括 . 4.10 小規模オプジェクト・アロケータのまとめ 4.11 -1 -4 「ー 0 っつひ 0 りつひワっ 4 -4 一 4 っ 00 ー -8 ) 一 0 っ 1 つ一り冖ー 0 -1 っ 4 -4 っしー 0 一 -4 -8 一 0 1 1 1
第Ⅱ部 第 5 章 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 5.13 5.14 5.15 5.16 第 6 章 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10 6.11 6.12 6.13 第 7 章 7.1 7.2 7.3 7.4 コンポーネント 汎用のファンクタ Command デザイン・パターン 現実世界におけるコマンド . 呼び出し可能な C 十十のエンティティ Functor クラス・テンプレートのスケルトン 転送用 Functor : : operator() の実装 ファンクタの取り扱い 1 つ作れば , おまけが付いてくる 引数と戻り型の変換 メンバ関数へのポインタの取り扱い バインド 要求のチェイニング 現実世界における問題 1 : 関数転送に掛かるコスト 現実世界における問題 2 : ヒープの割り当て . Functor とともにアンドウとリドウを実装する . 総括 . Functor のまとめ Singleton の実装 static データ + static 関数 ! = SingIeton 死んだ参照の問題 ( ) : 寿命を指定する Singleton 死んだ参照の問題 ( ) : Phoenix Singleton . 死んだ参照の問題 Singleton の破棄 Singleton の唯一性を保証する Singleton をサポートする C 十十の基本的イディオム Sing1etonHOIder クラス・テンプレートのまとめ 総括 . Sing1etonHoIder を用いる 全てを一つに マルチスレッド対応 寿命を指定する SingIeton の実装 スマート・ポインタ スマート・ポインタのメンバ関数 スマート・ポインタの領域 . スマート・ポインタいろいろ 取引 . 103 105 . 106 . 108 . 109 110 115 116 119 121 122 . 126 . 129 . 130 . 131 . 133 . 134 . 134 137 . 138 . 139 . 140 . 141 . 143 . 146 . 148 . 151 . 155 . 158 . 162 . 165 . 165 167 . 167 . 169 . 170 . 172
7.5 7.6 7.7 7.8 7.9 7.10 7.11 7.12 7.13 7.14 7.15 7.16 第 8 章 8.1 8.2 8.3 8.4 8.6 8.7 8.8 8.9 8.10 8.11 第 9 章 9.1 9.2 9.3 9.4 9.5 9.6 第 10 章 10.1 10.2 10.3 10.4 10.5 所有権の取り扱い戦略 アドレス演算子 . 生のポインタ型への暗黙の変換 等価性と非等価性 順序比較 チェックとエラーの報告 const を指しているスマート・ポインタと 配列 . スマート・ポインタとマルチスレッド オプジェクト・ファクトリの実装 C 十十におけるオプジェクト・ファクトリ : オプジェクト・ファクトリの必要性 オブジェクト・ファクトリ SmartPtr のまとめ 総括 . 全てを 1 つに 総括 . クローン・ファクトリ こまかい点 一般化 型識別子 const スマ ート・ポインタ クラスとオプジェクト 他のジェネリック・コンポーネントともにオプジェクト・ファクトリを使用する Factory クラス・テンプレートのまとめ 「循環式」 Visitor への回帰 Visitor のジェネリックな実装 実装の改良 : 非循環式 Visitor オーバーロード : 全てを捕捉する関数 Visitor の基本 Visitor AbstractFactory と ConcreteFactory のまとめ 総括 . プロトタイプに基づいた Abstract Factory の実装 AbstractFactory の実装 ジェネリックな AbstractFactory インタフェース Abstract Factory のアーキテクチャ上の役割 . A bstract Fa ctory C10neFact0 て y クラス・テンプレートのまとめ . 173 . 181 . 182 . 184 . 190 . 192 . 194 . 194 . 195 . 199 . 206 . 207 209 . 210 . 212 . 213 . 218 . 220 . 223 . 224 . 228 . 228 . 229 . 230 231 . 231 . 234 . 236 . 240 . 245 . 245 249 . 249 . 255 . 257 . 262 . 268
10.6 10.7 Visitor ジェネリック・コンポーネントのまとめ 10.8 第 11 章 11.1 11.2 11.3 11.4 11.5 11.6 11.7 11.8 11.9 11.10 11.11 11.12 11.13 11.14 付録 A A. 1 A. 2 A. 3 A. 4 A. 5 A. 6 A. 7 A. 8 参考文献 マルチメソッドとは ? マルチメソッド 総括 . ノヾリュ、一ション、 ポリシーとしての BasicDispatcher と BasicFastDispatcher 定数時間のマルチメソッド : 最高速度 引数の変換 : static-cast か dynamic-cast か ? ファンクタのダブル・ディスパッチ FnDispatcher と対称性 対数ダブル・ディスパッチャ カまかせのディスパッチャにおける対称性 カまかせのアプローチを自動化する 型の判定を二重化する : カまかせに行う方法 . どういった場合にマルチメソッドが必要なのか ? 総括 . セマフォ , イベント , その他もろもろ オプションの volatile 修飾子 オプジェクト指向プログラミングにおけるロックのセマンティックス ミューテックス 整数型に対するアトミックな操作 Loki のアプローチ マルチスレッド批評 最小限のマルチスレッド・ライブラリ ダブル・ディスパッチャのまとめ 総括 . 将来に向けて . 索引 V11 . 271 . 274 . 275 277 . 278 . 279 . 280 . 282 . 288 . 291 . 297 . 298 . 301 . 306 . 309 . 310 . 312 . 314 317 . 318 . 319 . 319 . 321 . 323 . 325 . 326 . 326 327 329
Abstract Factory デザイン・パターン , 53-55 , 76 ジェネリック・インタフェース , 234 ー 236 ーーのアーキテクチャ上の役割 , 231 ー 234 ーの基本的解説 , 231 ー 247 ーーの実装 , 236 ー 244 ーーのまとめ , 245 ー 247 AbstractEnemyFactory, 232 ー 233 , 235 ー 239 AcceptImp1, 265 , 269 , 272 , 273 Accept, 253 ー 268 AbstractProduct, 220 ー 227 , 229 ー 230 AbstractFactoryUnit, 234-236 AbstractFactory, 231 ー 247 A110cate, 87 , 89 , 91 Alexandrescu, Andrei, 31 after, 17 Add, 293 ー 297 , 299 , 316 Adapter, 299 Action, 106 Acquire, 172 , 321 ー 323 ACE, 326 A110wConversion, 205 a110cChunk-, 91 , 94 backEnd-, 297 , 311 available-, 84 auto-ptr, 114 , 169 , 179 AtomicIncrement, 197 At omi cDe crement , 197 AtomicAssign, 320 AtomicAdd, 320 AtExitFn, 153 ー 154 ATEXIT-FIXED, 147 atexit, 142-148 , 151 ー 152 , 159 AssocVector, 223 , 293-294 AssertCheckStrict, 205 AssertCheck, 205 assert, 205 Array ポリシー , 20 ー 22 ArrayStorage, 201 ー 202 App1ication, 106 Append, 62 ー 63 , 82 171 , 323 API ( アプリケーション・プログラミング・インタフェース ) AnotherDerived, 209 ALU ( 算術論理ユニット ) , 320 329 索引 BackEndType, 311 BadMonster, 231 ー 234 BadS01dier, 231 ー 234 , 242 BadSuperMonster, 231 ー 234 BankAc count , 322 Bar, 148 Base, 68 , 97 , 187 BASE-OF, 40 BaseLhs, 283 , 316 BaseProductList, 239 BaseRhs, 283 , 299 , 314 BaseSmartPtr, 6 BaseVisitab1e, 263 ー 265 BaseVisitor, 258 , 262 ー 265 , 267 , 269 , 274 , 275 BaseVisitorImp1, 274 ー 276 BasicDispatcher, 292-296 , 298 , 299 , 307 , 309 , 311 , 314 ー 316 BasicFastDispatcher, 307 , 309 , 314 ー 316 before, 17 BinderFirst, 127 BindFirst, 128 , 130 , 135 BitB1ast, 43 , 44 , 48-50 b10cksAvai1ab1e-, 88 , 89 b10ckSize-, 88 b001 , 111 , 185 , 186 , 188 -buffer, 143 Button, 54 , 231 ー 234 ca11backMap-, 295 , 297 callbacks-, 217 Ca11backType, 292 , 295 , 298 , 315 CastingP01icy ポリシー , 304 , 316 CatchA11 ポリシー , 273 , 274 , 276 Chain, 129 , 130 , 135 char, 27 , 38 , 121 ー 122 CheckingImp1, 206 Checking ポリシー , 16 , 194 , 200 , 205 , 206 chunkSize, 94 Circ1e, 215 C1ass, 212 C1assLeve1Lockab1e, 163 , 323 ー 325 C10ne, 32 , 114 , 131 , 175 , 224 ー 227 , 242 , 243 , 246 , 300 C10neFactory, 226 , 227 , 230 CLOS, 277 columns-, 308 COM ( コンポーネント・オプジェクト・モデル ) 142 , 202
330 Command デザイン・パターン , 105 ー 110 現実世界における一 , 108 ー 109 ーの基本的解説 , 106 ー 108 CompiIeTimeChecker, 27 ー 28 copyA1go, 49 copy-backward, 153 Copy, 43 , 48 Conversion ポリシー 39 ー 40 , 200 , 205 Conventiona1Dia10g, 231 const, 47 , 121 ー 122 , 194 ConcreteLifetimeTracker, 152 ー 154 Concret eFactory, 236 ー 240 , 242 , 244 ー 246 ConcreteCommand, 106 , 108 COMRefCounted, 205 Comp iIeTimeError, 27 CORBA (Common Object Request Broker Architecture) Create, 8 , 12 , 15 , 34-35 , 210 , 236 , 246 122 , 142 Defau1tLifetime, 163 DEFAULT THREADING, 101 DEFAULT-CHUNK-S I ZE, 100 ー 102 DeepCopy, 205 dea110cChunk-, 93 ー 94 Dea110cate, 88 ー 94 Czarnecki, Krzysztof, 58 Cyc1icVisitor, 268 ー 271 , 275 Creator ポリシー , 8 ー 10 , 12-15 , 158 , 163 ー 165 Creation ポリシー 161 CreateWindow, 54 CreateUsingNew, 163 CreateUsingMa110c, 163 CreateT, 234 CreateStatic, 163 CreateShapeCaIIback, 218 CreateShape, 218 CreateScr011Bar, 54 CreateObject, 221 CreateDocument, 211 CreateButton, 54 DEFINE-CYCLIC-VISITABLE, 270 delete, 13 , 96 ー 98 , 100 , 114 , 141 , 151 , 169 , 184 ー 189 #define プリプロセッサ指令 , 100 , 147 DEFINE-VISITABLE, 265 , 267 , 268 , 275 delete ロ , 194 , 201-202 De1eteChar, 133 DependencyManager, 150 Deposit, 322 Derived, 97 , 209 ー 210 DerivedToFront のアルゴリズム 68 ー 70 , 82 , 287 destroyed-, 144 , 147 -DestroySing1eton, 143 Destroy ポリシー , 21 DestructiveCopy, 205 Dia10g, 231 Dijkstra, Edgar, 321 ー 323 Disa110wConversion, 205 ー 207 DispatcherBackend ポリシー , 311 DispatchRhs, 284 ー 285 Disp1ay, 143 ー 151 , 180 Disp1ayStatistics, 254 索引 ン , 155 ー 158 DoCreate, 234 ー 236 , 238 , 239 , 244 , 246 DoC10ne, 225 , 226 DocE1ementVisitor. , 258 DocE1ementVisitor, 249 ー 262 DocE1ement, 249 ー 265 , 268 ー 271 Dylan , 277 DrawingType, 215 DrawingDevice, 306 Dr. Dobb's Journal, 133 DoubIe-Checked Locking パター double, 322 D0ttedLine, 225 DocumentManager, 210 , 211 Do cument , 210 DocStats, 250 ー 255 , 261 Gamma, Ralph, 262 GameApp, 241 FunkyDia10g, 231 ー 234 Functor テンプレート , 105 ー 115 , 121 , 124 , 129 , 133 , 228 Funct orType , 299 FunctorImp1, 111 ー 119 , 131 , 136 , 299-300 FunctorHand1er, 116 ー 119 , 124 ー 126 , 134 FunctorDispatcher, 298 ー 301 , 304 , 309 , 315 , 316 Functor2, 112 Functor1, 112 fun-, 120 , 122 free, 152 , 202 F00 , 109 , 148 FnDoub1eDispatcher, 295 FnDispatcher, 296 ー 298 , 301 , 304 , 309 , 315 , 316 FixedA110cator, 86 ー 87 , 90 ー 102 firstAvai1ab1eB10ck-, 87 ー 90 Fire, 284 ー 286 , 288 , 290 Fie1d, 73-76 , 79 ー 81 FastWidgetPtr, 18 FactoryError ポリシー , 221-223 , 230 FactoryErrorP01icy, 230 FactoryErrorImpI, 221 Factory, 220 , 228 ー 229 ExtendedWidget, 19 , 175 Executor, 283 ー 287 Execute, 106 , 108 EventHand1er, 77 EraseA11, 64 , 82 erase, 293 Erase, 63 ー 65 , 82 enum, 32 , 47 EnforceNotNu11, 16 , 19 , 20 EmptyType, 42 ー 43 , 50 , 115 else, 252 E11ipse, 215 , 282 , 288 E1ementAt, 21 Eisenecker, Ulrich, 58 Effective C ト + (Meyers) , 141 EasyLeve1EnemyFactory, 238 , 240 , 242 DynamicCaster, 304 ーーのコスト , 268 dynamic-cast, 252 , 256 , 258 ー 261 , 264 , 269
索引 GenLinearHierarchy, 77-81 , 238 , 239 , 242 , 245 GUI ( グラフィカル・ユーザ・インタフェース ) GraphicButton, 67 269 ー 276 GoF (Gang of Four) 本 , 106 , 108 , 129 , 133 , 211 , 249 , 262 , Go, 283 , 284 , 286 , 308 , 311 , 314 , 315 GetPrototype, 9 , 12 , 15 GetLongevity, 163 GetImp1Ref, 173 , 203 GetImp1, 173 , 184 , 195 , 203 , 207 GetC1assIndexStatic, 308 GetC1assIndex, 308 ー -309 geronimosWork, 124 GenScatterHierarchy, 70--81 , 234 ー 236 , 238 , 245 108 if-else ステートメント , 32 , 281 , 282 , 284 IdToProductMap, 227 IdentifierType, 221 , 226 , 229 HTMLDocument, 210 HeapStorage, 201 ー 202 HatchRectang1eP01y, 294 HatchingExecutor, 286 HatchingDispatcher, 288 Haskell, 277 Harrison, Tim, 155 IMPLEMENT-INDEXABLE-CLASS , 309 if ステートメント , 252 , 281 , 321 #ifdef プリプロセッサ指令 , 147 lnstance, 139 ー 140 , 143 ー 146 , 155 , 156 , 161 InsertChar, 127 , 129 , 133 insert, 218 lnlt, 43 , 88 INHERITS, 40 IndexOf, 60 , 82 , 290 IncrementFontSize, 254 , 255 KDL 問題 , 143 ー 151 , 164 isV01ati1e, 52 isStdUnsignedInt, 52 isStdSignedInt, 52 isStdIntegraI, 52 isStdFundamenta1, 45 ー 46 , 52 isStdF10at, 52 isStdArith, 52 isReference, 45 , 52 isPointer, 52 isConst, 52 InvocationTraits, 290 IntType, 197 , 320 lnt 2Type , 31 ー 34 , 74 ー 75 int, 169 LIFO ( 後入れ先出し ) , 143 Lifetime ポリシー , 158 ー 162 LifetimeTracker, 151 ー 152 less, 191 ー 192 Length, 82 Lattanzi, Len, 83 Knuth, Donald E. , 83 , 84 Ki11PhoenixSing1eton, 147 331 Line, 215 , 217 , 219 , 225 LISP, 57 ListOfTypes, 312 Lock, 156 , 196 , 323 LO ckedSt orage , 202 ー 208 LockingProxy, 196 ー 197 Log, 143 ー 151 logic-error, 162 Loki, 76 , 83 , 98 , 223 , 319 , 326 スマート・ポインタとーー , 173 マルチメソッドと - ー , 277 , 282 , 293 ー 294 , 304 , 312 ー 316 ミューテックスと - ー 321 10 Ⅱ g double データ型 , 52 lower-bound, 292 MacroCommand, 108 MakeAdapter, 30 ー 31 MakeCopy, 175 MakeT, 234 malloc, 152 map, 216 ー 218 , 223 , 292 Martin, Robert, 258 MAX-SMALL-OBJECT-SIZE, 100 ー 102 maxObjectSize, 94 MemContr01B10ck, 84 ー 86 MemFunHand1er, 124 ー 126 , 134 Meyers, Scott, 83 , 141 ー 143 , 291 , 295 Meyers の Singleton, 141 ー 143 ML, 277 Moda1Dia10g, 29 Monster, 231 ー 234 , 236 , 241 More Effective C ト + (Meyers) , 279 , 291 , 295 MostDerived, 68 , 82 Mu1timethods . h, 310 Mu1tiThreaded, 6 Mu1tiThreadedRefCouting, 198 ー 199 mutex-, 156 MyContr011er, 29 MyOn1yPrinter, 138 MyVisitor, 270 name, 219 new ロ , 194 new 配置構文 , 147 next ー , 198 NiftyContainer, 32 ー 33 , 35 ー 37 OpNewCreat or, 10 OnUnknownVisitor, 273 ー 275 OnEvent, 77 OnError, 286 OnDeadReference, 146 ー 148 , 159 ObjectLeve1Lockab1e, 323-325 Nu11Type, 42 ー 44 , 52 , 56 , 58 ー 61 , 67 ー 70 , 284 NOQuaIifiedType, 52 NonVOIatiIeType, 52 NonConstType, 52 NoDup1icates, 66 ー 67 , 82 NODestroy, 163 NoCopy, 205 NoCheck, 16 , 19 , 20
332 OpNewFactoryUnit, 237 ー 239 , 245 , 246 OutIt, 43 Ownership ポリシー , 194 ー 195 , 198 , 200 , 202 ー 205 Paragraph, 251 , 254 ー 256 , 259 , 261 , 263 , 264 , 268 ー 270 ParameterType, 46 ー 47 , 52 , 131 ParagraphVisitor, 259 , 261 , 264 ParentFunctor, 118 , 127 Parm1, 115 , 118 Parm2, 115 , 118 ParmN 115 Parrot, 122 ー 126 Patten•u 〃砒 c 房れ 9 pData-, 92 pDocEIem, 261 pDup1icateShape, 225 pDynObject, 149 pFactory-, 233 (VIissides) 141 Phoenix SingIeton, 146-151 , 158 , 163 pimpl イディオム , 84 plnstance-, 139-140 , 145 , 147 , 155 ー 158 , 160 pLastA110c-, 95 POD ( 平凡な古いデータ ) 構造 , 49 ー 50 Point3D, 76 pointee-, 168 , 170 , 171 , 179 , 189 , 195 , 201 PointeeType, 44 ー 45 , 52 , 170 ー 172 P0interTOObj , 125 PointerTraits, 44 ー 45 PointerType, 171 , 202 , 203 P01y, 282 , 286 , 294 , 295 P01ygon, 215 , 219 , 225 prev-, 198 Printer, 172 ー 173 printf, 112 printingPort-, 139 priority-queue, 151 ー 154 ProductCreator, 223 ー 224 , 229 ー 230 Prot0typeFactoryUnit, 242 ー 244 , 246 Prot0type デザイン・バターン , 240 ー 244 pTrackerArray, 152 RasterBitmap, 251 , 255 , 256 , 259 , 263 , 264 , 269 , 270 RasterBitmapVisitor, 264 realloc, 152 Receiver, 106 , 108 Rectang1e, 281 , 282 , 287 , 288 , 294 , 295 , 305 Resu1t, 59 Reset, 173 Rep1aceA11, 67 , 82 Rep1ace, 66 , 82 Re1ease, 172 ー 173 , 202 , 321 , 322 RejectNu11Strict, 206 RejectNuIIStatic, 205 ー 206 RejectNu11, 206 RegisterShape, 217 , 218 RefLinked, 205 ReferencedType, 44 ー 45 , 52 RefCountedMT 205 RefCounted, 5 , 205 RMW ( 読み込み - 更新 - 書き出し ) 操作 , 319 一 321 Resu1tType, 118 , 283 , 299 , 300 索引 RoundedRectang1e, 281 , 282 , 287 , 294 , 301 ー 303 RoundedShape , 301 ー 303 runtime-error, 145 , 222 , 311 , 316 safe—reinterpret-cast 28 SafeWidgetPtr, 18 sameType, 39 Save, 214 ー 215 scanf, 112 Schedu1eDestruction, 159 ー 160 Schmidt, DougIas, 155 ー 157 Scr011, 129 Scr011Bar, 54 Secretary, 6 Section, 268 Se1ect, 35 ー 37 , 68 SetLongevity, 148 ー 154 , 159 SetPrototype, 9 , 12 , 15 , 243 Shape, 212 ー 213 , 279 , 280 , 282 , 295 , 301 ー 303 , 305 , 306 ShapeCaster, 305 ShapeFactory, 216 , 217 , 228 Si11yMonster, 231-234 , 238 Si11yS01dier, 231 ー 234 , 242 SiIIySuperMonster, 231 ー 234 Sing1eThreaded, 163 , 325 S ingleton, → S ing1etonH01der DoubIe-Checked Locking パターンとーー Meyers の - ー , 141 ー 143 Phoenix—, 146 ー 151 , 158 , 159 , 162 , 163 155 ー 158 マルチスレッドと - ー , 155 ー 158 ーーの保証 , 140 ー 141 ーーの破棄 , 141 ー 143 ーーの実装 , 137 ー 164 何でもやっちゃえインタフェースの失敗と一 , 4 ー 5 静的関数と一 , 138 死んだ参照の問題と一 , 143 ー 151 寿命と一 , 148 ー 154 STATI C-CHECK , 27 static-cast, 301-306 , 316 static, 295 splmpl-, 118 SomeVisitor, 264 , 267 SomeThreadingMode1, 325 SomeRhs, 294 , 300 SomeLhs, 294 , 300 S01dier, 231 ー 234 , 236 , 241 ー 242 SmartPtr, 3 , 6 ー 8 , 15 ー 22 , 47 , 93 , 167-208 Sma110bj ect, 86 ー 87 , 96 ー 102 , 132 Sma110bjA110cator, 86 ー 87 , 94 ー 96 , 98 ー 102 Sma11A110c . h, 99 ー 102 -Size の使用 , 97 sizeof, 27 , 37 一 40 , 89 , 97 size-t, 39 , 85 Sing1etonWithLongevity, 162 ー 164 ーのまとめ , 165 ー - の分解 , 158 ー 160 ー - の使用 , 162 ー 164 ーーの組み立て , 160 ー 162 228 Sing1etonH01der, 3 , → Singleton, 98 , 137-138 , 158 ー 162 , ーをサポートする 0- + の基本的なイディオム , 139 ー 140
索引 StaticDispatcher, 282 ー 291 , 314 ー 315 stats, 261 STL, 122 , 182 StorageImp1, 201 , 203 Storage ポリシー , 18 , 171 , 173 , 197 , 200 ー 202 Strategy デザイン・パターン , 8 String, 319 , 323 Stroustrup , Bj arne , 214 struct, 49 Structure ポリシー , 17 ー 18 SuperMonster, 231 ー 234 , 236 SUPERSUBCLASS, 40 , 68 Surprises. cpp, 236 Sutter Herb, 83 switch, 215 SwitchPrototype, 14 ー 15 TemporarySe cret ary , 6 Tester, 189 Tester*, 189 TestFunction, 120 ー 122 TextDocument, 210 ThreadingMode1, 16 , 158 , 159 , 161 , 163 , 198 , 319 ー 326 TList, 57 ー 76 , 81 , 127 , 135 , 234 , 245 ー 247 , 275 Tramp01ine, 297 Triang1e, 305 type-info, 40 ー 42 , 58 , 218 ー 219 , 226 ー 227 , 291-292 , 311 VisitRasterBitmap, 255 VisitParagraph, 254 , 255 , 261 非循環 , 257 ー 262 バリエーション , 271 ー 274 ーーのまとめ , 275-276 - ーのジェネリックな実装 , 262 ー 268 ーの基本的解説 , 249 ー 276 全てを捕捉する関数と一 , 255 ー 256 , 271 ー 274 循環 , 257 ー 262 , 268 ー 271 厳格でない訪問と一 274 Visitor デザイン・パターン Visitab1e, 263 ー 268 Visit, 262 , 268 , 269 Veldhuizen, Todd, 58 VectorizedDrawing, 272 VectorGraphic, 258 VaIueType , 36 upper-bound, 153 UpdateStats, 251 , 252 Un10ck, 196 UCHAR-MAX, 89 TypeTraits, 43 ー 51 , 131 , 194 TypesRhs, 283 ー 284 , 288 TypesLhs, 283 ー 284 , 288 Type1ist. h, 55 , 57 , 60 , 81 TYPELIST, 310 TypeInfo, 40 ー 42 , 50 , 230 , 291 ー 292 typeid, 40 , 282 typedef, 16 , 20 , 55 , 59 , 228 , 311 TypeAtNonStrict, 60 , 82 , 115 TypeAt, 60 , 82 Type2Type, 34 ー 35 , 234 333 VisitVectorGraphic, 258 Vlissides, John, 141 void*, 183 volatile, 160 , 325 V01ati1eType, 160 , 325 Widget, 28-35 , 41 , 47 , 67 一 68 , 169 , 175 , 196 , 325 WidgetEventHand1er, 77 ー 79 WidgetFactory, 53 ー 55 WidgetInfo, 71 ー 76 WidgetManager, 10 ー 15 , 20 ー 22 Window, 54 Withdraw, 322 X Window, 110 アドレス演算子 , 181 ー 182 アルゴリズム コピー , 43 コンノヾイル時の一一 , 82 線形探索 , 60 タイプリスト操作 , 82 アロケータ , →小規模オプジェクトの割り当て 固定長一 , 90 ー 94 デフォルトの自由領域ー , 84 ーの作業 , 84 ー 86 メモリ・チャンクと一 - 87 ー 90 アンドウ , 129 , 133 一定時間のマルチメソッド , 306 ー 309 一般化 , →汎用のファンクタ ( 220 , →汎用のファンクタ ) 223 イベント , 77 , 326 インタフェース Abstract Factory デザイン・パターン , 234-236 アプリケーション・プログラム (API) , 171 , 323 グラフィカル・ユーザーー (GUI) , 108 何でもやっちゃえーの失敗 , 4 ー 5 ーの分離 , 107 ーの粒度 , 236 インデックスによるアクセス , 59 ー 60 ユ - ラー コンパイル時の表明と一メッセージ , 25 ー - の報告 , 192 ー 194 演算子 operator T* 183 , 185 , 187 , 189 operator ! = operator(), 110 , 111 , 113-116 , 118 , 120 , 123 , 130 ー 136 , 298 , 299 , 301 operator*, 167 , 172 ー 173 , 190-193 operator->, 167 , 170 ー 173 , 176 , 193 ー 197 operator—>*, 110 , 123 ope て ato て . * , 110 , 123 operator く , 190 operator く =, 190 ー 192 operator= 173 187- ー 189 operator== operator>, 190 ー 192 operator>=, 190 ー 192 operator ロ , 60 , 195 , 294
索引 334 オプジェクト・ファクトリ 一般化と一 , 22g223 型識別子と一 , 218 ー 219 クラスとーー , 212 一 213 ジェネリック・コンポーネントを用いた一・の使用 , 228 ー - テンプレート , 228 ー 230 ーの基本的解説 , 209 ー 230 ー - の実装 , 213-218 ーの必要性 , 210 ー 212 ー・のまとめ , 229 ー 230 拡散ー , 70 ー 76 線形ー , 77 ー 79 ー関数 , 252 ー - コンストラクタのジレンマ , 240 ーーから型へのマッピング , 34 ー 35 基本型の検出 , 45 ー 46 識別子の一 , 213 , 218 ー 219 ー修飾子 , 325 整数ー , 319 ー 321 多重継承と一 , 6 ー中の要素の交換 , 66 ー 67 ーに対するアトミックな操作 , 319 ー 321 ーの安全性と静的型の欠点 , 4 ーの選択 , 35-37 ーの特性 , 43 ー 50 パラメーターの最適化 , 46-47 汎用のファンクタと一の変換 , 121 -122 マルチスレッドとーー 319 ー 321 型の判定の二重化 , 280 ー 282 カプセル化 , 105 関数 Singleton と静的 - ー , 138 転送ーーのコスト , 130 ー 131 管理 データ・レベル , 195 , 197 キーポード , 143 ー 151 , 164 共変の戻り型 , 225 ー 226 具体的成果物 , 234 , 236 クラス , →継承 , ポリシー・クラス 31 f inal— オプジェクト・ファクトリと一 - 212 ー 213 基底ー , 239 タイプリストを用いたーーの生成 , 70 ー 81 ーーの使用 , 162 ー 164 ーの導出 , 239 ーの分解 , 20-22 訪問一 , 262-268 訪問可能ー , 262 ー 268 ーーレベルのロック操作 , 199 ローカルー - , 30 ー 31 クローン・オプジェクト・ファクトリ , 224-227 継承 コンパイル時点での検出 , 37 ー 40 対数ディスパッチと一 多重ー , 6 POD ( 平凡な古いデータ ) , 49 ー 50 ーの特殊化 , 7 ポリシー・クラスにおける一一のカスタマイズ , 17 ー 18 効率的なリソースの使用 , 318 コールバック , 109 ー 110 , 217 , 295 ー 297 コピー 構築時における一の省略 , 130 出力時一 (COW) , 175 ー 176 ディープーー , 131 , 174-175 , 205 破壊型ー , 179 ー 181 コマンド , → Command デザイン・パタ ーン アクテイプーー , 108 ーの転送 , 108 コンパイラによる手品 , 96 ー 98 コンノヾイル寺 ーにおける変換可能性と継承の検出 , 37 ー 40 ーの表明 , 25 ー 28 コンパイル時における互換性の検出 , 37 ー 40 指しているオプジェクトのレベル , 195-197 参照 - ーカウント方式 , 176 ー 178 , 197 ー 198 ーーリンク方式 , 178 ー 179 , 198 ー 199 参照外し時のチェック , 193 参照リンク方式 , 178 ー 179 実行時型情報 (RTTI) , 219 , 227 , 259 , 268 , 291 実体化 , 14 ー 15 , 127 , 287 , 289 修飾子の除去 , 47 ー 48 寿命 , 148 ー 154 , 158 , 161 循環 -- 依存 , 257 ー 262 - ー参照 , 179 循環依存 , 150 小規模オプジェクトの割り当て , →アロケ ータ 固定長アロケータと一 - , 90 ー 94 固定長割り当てと一 , 90 ー 94 コンパイラによる手品と一 96 ー 98 手品と一 , 96 ー 98 デフォルトの自由領域アロケータと一 , 84 ーの基本的解説 , 83-102 ーーのまとめ , 101 ー 102 標準の自由領域割り当てと一 , 83 メモリ・チャンクと一 3 87-90 状態の操作 , 6 初期化 オプジェクト・ファクトリと -- 209 ー一時のチェック , 192 ー 194 静的なー , 140 遅延ー , 193 動的なー , 140 所有権の取り扱い戦略 , 173 ー 181 死んだ参照の検出 , 143 ー 146 死んだ参照の問題 , 143 ー 151 侵入型参照カウント方式 , →参照カウント方式 スキン対応プログラム , 109 ステートメント 構造 層想 階仮型 294 ー 295
索引 if, 252 , 281 , 321 if-else, 32 , 281 , 282 , 284 スマート・ポインタ アドレス演算子どー , 181 ー 182 暗黙の変換とーー , 182 ー 184 工ラー報告とーー , 192 ー 194 書き出し時コピー (COW) と一 , 175 ー 176 ーー型の暗黙の変換 , 182 ー 184 参照カウント方式と・一 , 176 ー 178 , 197 ー 198 参照追跡方式と一 , 198-199 参照リンク方式とーー , 178 ー 179 順序比較演算子と一 , 190 ー 192 チェックの問題と一 , 192 一 194 ディープ・コピーとーー 174 ー 175 等価性と一 , 184 ー 189 生の一一 , 182 ー 184 195-199 マルチスレッドし一 非等価性と一 , 184 ー 189 破壊型コピーと一 , 179 ー 181 194 ー 195 配列と一 ーーのまとめ , 207 ー 208 の所有権取り扱い戦略 , 173 ー 181 ーの基本的解説 , 167 ー 208 何でもやっちゃえインタフェースの失敗と一 , 4 ー 5 対称性 , 288 ー 291 対称型マルチプロセッサ , 157 ファンクタどー , 105 - ーのロック , 323 ー 325 何でもやっちゃえインタフェースの失敗と一 , 4 ー 5 セマンティックス セマフォ , 326 対数時間のダブル・ディスパッチャ , 277 , 291 ー 301 , 314 ー 316 - ーに対するコンパイル時のアルゴリズム操作 , 82 長さの算出と - , 57 ー 58 基本的な型と一の検出 , 45 ー 46 タイプリスト , 234 , 282 , 283 , 287 対数ダブル・ディスパッチャ , 277 , 291 ー 301 , 314 ー 316 メモリの - ー , 87 ー 94 チャンク チェックの問題 , 192 ー 194 タブルの生成 , 76 ダブル・ディスパッチ , 277 , 280 - ースライシング , 317 タイム ーの分離 , 107 タイミング ーを用いたクラス生成 , - ーへの連結 , 62 ー 63 ーのまとめ , 81 ーの部分的な並べ替え , ーの必要性 , 53 ー 55 ーーの定義 , 55 ー 56 ーの生成 , 57 ーの検索 , 60 ー 61 ーの基本的解説 , 53 ー 81 70 ー 79 67 ー 70 直交性のあるポリシー , 21 抽象的成果物 , 220 ー 227 , 229-230 , 234 , 242 335 109 ディープ・コピー , 131 , 174 ー 175 , 200 定数 ツール・メニュー DoubIe-Checked Locking パターン , 155 ー 158 Command パターン , 105 ー 110 Abstract Factory パターン , 53 ー 55 , 76 , 231 ー 247 ノヾターン バインド , 122 , 124 , 127 , 129 , 132 ー 135 配列 , 20 ー 22 , 194 ー 195 入出金 , 322 何でもやっちゃえインタフェースの失敗 , 4 ー 5 生のポインタ型への暗黙の変換 , 182-184 名前の循環依存 , 257 トランポリン関数 ( サンク ) , 295 ー 300 独自バウンシング仮想関数 , 253 統計情報 , 250 同期化オプジェクト , 319 等価性 , 184 ー 189 「天変地異効果」 , 180 テンプレート化された演算子 , 187 ーーを用いたポリシー・クラスの実装 , 12 ーの利点 , 6 ー 8 ーの部分的な特殊化 , 57-58 テンプレート・パラメータ , 10 ー 12 , 70 —Functor クラスの一一スケルトン , 110 ー 115 テンプレート 転送関数のコスト , 130 ー 131 デフォルトの自由領域アロケータ , 84 デストラクタ , 13 ー 14 Strategy パターン , 8 Prototype パターン , 240 ー 244 DoubIe-Checked Locking パターン , 155 ー 158 Command パターン , 105 ー 110 Abstract Factory パターン , 53 ー 55 , 76 , 231 ー 236 デザイン・パターン 整数 - ーの型へのマッピング , 31 ー 34 Prototype パターン , 240 ー 244 Strategy パターン , 8 バタフライ割り当て , 92-94 パラメータ 最適化されたー型 , 46 ー 47 テンプレートーー , 10 ー 12 , 70 , 112 バルク割り当て , 92 , 93 , 95 ハンドル , 171 汎用のファンクタ , →ファンクタ Command デザイン・パターンとーー 現実世界の問題と一 , 130 ー 133 チェイニング要求と一 , 129 ー 130 - の基本的解説 , 105 ー 136 ・一の取り扱い , 116 ー 119 ・一のまとめ , 134 ー 136 バインドと一 , 126 ー 129 ヒープ割り当てと一 , 131 ー 133 引数の型変換と一 , 121 ー 122 戻り型の変換と一 , 121 ー 122 106 ー 108 ーを用いたアンドウとリドウの実装 , 133
336 ヒープ , 131 ー 133 , 201 ー 202 比較演算子 , 190 ー 192 引数 , 121 ー 122 , 301 ー 306 非テンプレート化演算子 , 187 ー 型識別子と - 218 ー 219 クラスと -- , 212 ー 213 索引 189 非等価性 , 184 ー 189 非同期実行 , 318 描画 , 213 ー 218 表明 コンノヾイル時の一一 25 ー 28 ファクトリ 一般化と一 220 ー 223 ジェネリック・コンポーネントを用いた テンプレート , 229 ー 230 ーの基本的解説 , 209--230 ー・の実装 , 213 ー 218 ーの必要性 , 210 ー 212 ー - のまとめ , 229 ー 230 ファンクタ Command デザイン・パターンと - ー , 106 ー 108 228 戻り型の変換と一 , 121 ー 122 マルチメソッドとーー , 298 ー 301 引数の型変換と一 , 121 ー 122 ヒープの割り当てと一 , 131 ー 133 汎用の - ー , 105 ー 136 バインドと一 , 126 ー 129 ・一のまとめ , 134 ー 136 ーーの取り扱い , 116 ー 119 ーーのダブル・ディスパッチ , 298 ー 301 ーの基本的解説 , 105 ー 136 チェイニング要求と一 , 129 ー 130 現実世界の問題と一 , 130 ー 133 不完全な実体化によるオプション機能 , 14 ー 15 ーを用いたアンドウとリドウの実装 , 133 変換 順序比較演算子と一 , 190 ー 192 参照リンクどー , 178 ー 179 参照追跡と一 , 198-199 参照カウント方式と一 , 176 ー 178 , 197 ー 198 ー型の暗黙の変換 , 182 ー 184 書き出し時コピー (COW) と一 工ラーの報告と一 , 192 ー 194 暗黙の変換と一 , 182 ー 184 アドレス演算子と一 , 181 ー 182 ポインタ ユーザ定義ー , 182 戻り型の一一 , 121 ー 122 引数の一一 , 121 ー 122 , 301-306 生のポインタ型への暗黙の一 , 182 ー 184 ーとしてのバインド , 126 ー 129 Type1ist . h, 55 , 57 , 60 , 81 Sma11A110c . h, 99 Mu1timethods . h, 310 DocE1ementVisitor. h, 258 ヘッダ・ファイル べクタ , 194 プロトタイプ , 240 ー 244 175 ー 176 所有権取り扱い戦略 , 173 ー 181 チェックの問題と一 , 192 ー 194 ディープ・コピーどー 174 ー 175 等価性と一 , 184-189 生の - ー , 182 ー 184 何でもやっちゃえインタフェースの失敗と - , 4 ー 5 CatchA11 ポリシー , 273 , 274 , 276 CastingP01icy ポリシー , 304 , 316 Array ポリシー , 20 ー 22 ポリシー ( 名前順 ) - を用いた構造のカスタマイズ , 17 ー 18 ーーのデストラクタ , 13 ー 14 ーの実装 , 10 ー 12 - ーの結合 , 15 ー 17 ーの基本的解説 , 3 ー 23 ・クラス , →クラス マルチメソッドと - ー , 309 ー 310 ーの基本的解説 , 3 , 8 ー 12 ーの格納 , 162 ーの拡張 , 12 ー 13 直交性のある一 , 21 18 ー 20 互換性のない一 互換性のある一 , 18-20 クラスの一一への分解 , 20 ー 22 Singleton とーー , 159 ー 160 , 162 BasicFastDispatcher と -- ・ 309 ー 310 BasicDispatcher と - ー 309 ー 310 于リシー・クラス メンバ関数への一一の取り扱い , 122 ー 126 マルチスレッドとーー , 195 ー 199 非等価性と一 , 184 ー 189 破壊型コピーと - , 179 ー 181 配列とーー , 194 ー 195 ーーのまとめ , 207 ー 208 ーの特性の実装 , 44 ー 45 ーの基本的解説 , 167 ー 208 ポリシ ポリヾ Creator ポリシー , 8 ー 10 , 12 ー 15 , 158 , 159 , 163 ー 165 Creation ポリシー , 159 , 161 , 163 Conversion ポリシー , 39-40 , 200 , 205 Checking ポリシー , 16 , 18 , 194 , 200 , 205 , 206 ThreadingMode1 ポリシー , 16 , 17 , 158 , 159 , 161 , 163 , Structure ポリシー , 17 , 18 Storage ポリシー , 18 , 171 , 173 , 197 , 200 ー 202 Ownership ポリシー , 194 ー 195 , 198 , 200 , 202 ー 205 Lifetime ポリシー , 158 ー 162 FactoryError ポリシー 221-223 , 230 DispatcherBackend ポリシー 311 Destroy ポリシー 21 整数定数の型への一 , 31 ー 34 型から型への - ー , 34 ー 35 マッピング マクロ , 108 , 265 , 268-270 , 275 翻訳単位 , 140 マルチメソッドとーー 277 オプジェクト・ファクトリと一 210 ー 212 , 224 ー 227 Abstract Factory の実装どー ポリモフィズム , 83 , 174 ー 175 198 , 319 ー 326 240 ー 242 管理データ・レベルの・一 , 197 ー 199 マルチスレッド , 155 ー 158 , 318 ー 323
索引 195 ー 197 指しているオプジェクト・レベルの一 - 参照カウント方式と一 - , 197 ー 198 一定時間の - ー , 306 ー 309 マルチメソッド - ーライプラリ , 317 ー 326 ミューテックスとーー 321 ー 323 ー - 批判 , 318 ー 319 スマート・ポインタとーー , 195 ー 199 参照追跡と一 3 198 ー 199 ーーのチャンク , 87 ー 94 - アロケータの動作 , 84 ー 86 RMW ( 読み込み - 更新 - 書き出し ) 操作 , 320 メモリ ミューテックス , 156 ー 158 , 321 ー 323 引数と一 , 301 ー 306 ーーのまとめ , 314 ー 316 ーの必要性 , 279-280 ーの基本的解説 , 277 ー 316 対数ダブル・ディスパッチャと - 対称性と一 , 288 ー 291 型の判定の二重化 , 280 ー 282 291-301 337 ヒープ - ー 戻り型 共変の一 131 ー 133 , 201 ーー 202 239 ・一の変換 , 121 ー 122 汎用のファンクタとーー 要求のチェイニング , 129 呼び出し可能工ンティティ , 109 ー 110 リソース・リーク , 142 リドウ , 133 粒度の高いインタフェース , 236 例外 , 221 連想コレクション , 216 ロック 121 ー 122 ーーのセマンティックス , 323 ー 325 クラス・レベルの一一 , 323 オプジェクト・レベルの一 - , 323 Double-Checked Locking パターン 155 ー 158
本書の内容に関するご質問は、小社出版部宛まで必ず 書面にてお送りください。電話による内容のお問い合 わせはご容赦ください。また本書の範囲を超えるご質 問につきましてはお答えできかねる場合もありますの で、あらかじめご承知おきください。 C + + 旧- ロ epth Series Modern C + + Design 初版第 10 刷発行 初版第 1 刷発行 ジェネリック・プログラミングおよびデザイン・バターンを利用するための究極のテンプレート活用術 2001 年 12 月 20 日 2006 年 10 月 10 日 ・著者 ・訳者 ・発行人 ・発行所 ■印刷十製本 . アンドレイ・アレキサンドレスク .. 村上雅章 . 小島昌光 株式会社ピアソン・エデュケーション 〒 166-0003 出版営業部 三美印刷株式会社 東京都杉並区高円寺南 2-44-5 FAX ( 0 の 3 引 4-8169 電話 ( 03 ) 5929-6050 http: 〃 www.pearsoned.co.jp/ Authorized translation 伝 om the English language edition MODERN C + + DESIGN: GENERIC PROGRAMMING AND DESIGN PATTERNS APPLIED, 1 st edition by ALFXANDRESCU, ANDREI published トメ Pearson Education, lnc, publishing as Addison WesIey, Copyright ◎ 2001 by Addison WesIey AII rights reserved. No part of this book may be reproduced or transmitted in any form 0 「 by any means, electronic 0 「 mechanical, including photocopytng, recording 0 「 by any lnformauon storage retrieval system, without permission 丘 om Pearson Educatiom lnc. JAPANESE language edition published by PEARSON EDUCATION JAPAN, Copyright ◎ 2001 Printed in Japan ISBN 4-89471-435-3